home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 10
/
The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso
/
PC_SIGCD
/
05
/
6
/
DISK0564.ZIP
/
SOURCE.ARC
/
SHOW.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-07-09
|
24KB
|
549 lines
TITLE SHOW - MSDOS FILE DISPLAY PROGRAM
PAGE 55,132
;****************************************************************************
; BIDIRECTIONAL FILE DISPLAY PROGRAM FOR MSDOS 2
;
; BY: JON DART
; 3012 HAWTHORN ST.,
; SAN DIEGO, CA 92104
;
; VERSION 2.2, 01-Nov-87
;
; THIS IS A MODIFIED VERSION OF THE CP/M PROGRAM 'BISHOW' ON SIG/M V. 145.
; I ADDED SOME MODS OF MY OWN TO THE CP/M VERSION, AND THEN TRANSLATED
; IT TO MSDOS, USING THE PROGRAM 'ICT.COM' FROM THE HEATH USERS' GROUP.
; (A CP/M-86 VERSION OF THE PROGRAM EXISTS, BUT I DIDN'T MAKE USE OF IT
; IN PREPARING THIS VERSION).
;
; FURTHER ENHANCEMENTS WERE ADDED TO THE MSDOS VERSION, AS FOLLOWS:
;
; 1. TAB CHARACTERS ARE EXPANDED AND LINES ARE TRUNCATED AFTER 80 COLS.
;
; 2. FOR COMPATIBILITY WITH WORD PERFECT (tm) FILES, LINE FEEDS WITHOUT
; CARRIAGE RETURNS AND CARRIAGE RETURNS W/O LINE FEEDS ARE TREATED THE
; SAME AS CR + LF. (WORDSTAR (tm) FILES ARE ALSO HANDLED CORRECTLY, SINCE
; THE HI BITS ARE STRIPPED OFF.)
;
; 3. 'B' GOES TO BEGINNING OF FILE, 'E' SKIPS TO END.
;****************************************************
; TO BUILD SHOW.EXE:
; MASM SHOW,SHOW,NUL,NUL
; LINK SHOW,SHOW,NUL,ASM
;
;****************************************************
; ORIGINAL COMMENTS FROM THE CP/M VERSION:
;
;A buffered, bidirectional version of SHOW.ASM.
;Ver 1.0, 23 Aug 82
;Phil Cary, 748 Kenilworth Parkway, Baton Rouge, LA 70808
;Ver 1.1, 30 Mar 83 added BDOS function 6 W.F.McGee
;Ver 1.2, 22 May 83 added hi-bit mask for WordStar files
; and Wyse-100/200 SCRL keys-changed messages
; also made CP/M-86 ver using XLT86 see A86 file
; H.M. Van Tassell
;modified for H89 by Jon Dart 04/13/84 -- uses H89 up and down arrow keys.
;Also cleaned up code, made pgrm. return to CCP instead of warm-booting.
;
;BISHOW is a buffered, bidirectional version of SHOW.ASM which first
;appeared in Interface Age, November, 1981. That program could
;only scroll forward in a file, and read sectors from disk one at a
;time as they were sent to the console. I used SHOW frequently to take
;a quick look at a file without loading a big text editor, and to examine
;another file with the RUN command while in Wordstar. TYPE does not work
;since it is not a file that Wordstar can load and run.
;
;It was annoying when I went past the point I was looking for in a file
;with SHOW, and could not go backwards. Thus, this bidirectional version
;which uses random access reads. In addition, buffering was added so that
;the number of disk reads would be reduced, and moving back and forth
;in a moderate sized file would be speeded up. There is a trade off
;between the size of the buffer and the length of time it takes to refill
;the buffer which should be set to the user's preference.
;
;Just a small contribution to the public domain software as partial
;payment for the many fine and educational programs the system has
;given me. Phil Cary.
DOSSEG
.MODEL SMALL
;*************
; BEGIN CODE *
;*************
.XLIST
INCLUDE MSDOS2.DEF
INCLUDE ASCII.DEF
INCLUDE MACROS.DEF
.LIST
MAXSEC EQU 64 ;BUFFER SIZE IN 128-BYTE RECORDS
FULBUF EQU (MAXSEC*128) ;OFFSET TO END OF BUFFER
EOF EQU CTRL$Z ;END OF FILE CHAR.
TRUE EQU 1
FALSE EQU 1-TRUE
IBM EQU TRUE ;TRUE IF IBM-COMPAT AT BIOS LEVEL
BIOS EQU 10H ;IBM INTERRUPT FOR BIOS VIDEO SERVICES
; MEMORY ALLOCATION
.DATA
JMPTBL DW OFFSET _TEXT:BCMD ;JUMP TABLE TO COMMAND ROUTINES
DW OFFSET _TEXT:ECMD ;(PUT HERE BECAUSE MUST BE DEFINED ON PASS 1)
DW OFFSET _TEXT:XCMD
CMDLST DB 'BEX',0 ;VALID COMMANDS
LINMAX DB 24 ;NUMBER OF TO WRITE LINES ON CONSOLE
LINCNT DB 0 ;LINE NUMBER ON WRITE OR MOVE BACK IN BUFFER
COLCNT DB 1 ;COUNT OF COLUMNS WRITTEN TO DISPLAY
AMTREAD DW 0 ;AMOUNT READ ON LAST READ OP
FILEPOS DQ 0 ;OFFSET FROM START OF FILE
INHANDLE DW 0 ;INPUT FILE HANDLE
.DATA?
VMODE DB 1 DUP (?) ;VIDEO MODE (IBM ONLY)
VPAGE DB 1 DUP (?) ;VIDEO PAGE (IBM ONLY)
SCRSIZE DB 1 DUP (?) ;PHYSICAL SCREEN WIDTH, COLUMNS
BUFFER DB FULBUF DUP (?)
.STACK
DB 512 DUP (?)
.CODE
EXTRN SKIPSP:NEAR,TYPTX:NEAR,UC:NEAR,CMDSRC:NEAR
EXTRN CLRCO:NEAR,CIN:NEAR,COUT:NEAR
ENTRY: JMP SHORT START ;SKIP OVER NEXT SUBROUTINE
; ROUTINE TO CLEAR SCREEN, HOME CURSOR:
; (MAY HAVE TO CHANGE FOR NON-IBM MACHINES)
CLRSCR PROC NEAR
PUSH BX
IF IBM
PUSH DS
MOV AX,DGROUP
MOV DS,AX
MOV DX,0
CALL MOVEXY ;MOVE TO HOME POSITION
MOV AL,BYTE PTR DGROUP:VMODE ;GET CURRENT VIDEO MODE
MOV AH,0
INT BIOS ;RESET MODE (CLEARS SCREEN)
POP DS
ELSE
MOV AL,FF ;USE FF (WILL WORK ON MOST TERMINALS)
CALL COUT ;(OR ADD YOUR CLEAR SCREEN FN. HERE)
ENDIF
POP BX
RET
CLRSCR ENDP
MOVEXY PROC NEAR ;MOVE TO ROW (DH) AND COLUMN (DL)
MOV AH,2
MOV BH,BYTE PTR DGROUP:VPAGE ;VIDEO PAGE #
MOV BL,0 ;COLOR (DON'T CHANGE)
INT BIOS ;MOVE CURSOR
RET
MOVEXY ENDP
START: TEST_DOS2 ;TEST FOR DOS 2.0
PUSH DS ;SAVE DATA SEG (POINTS TO PSP)
MOV AX,DGROUP
MOV DS,AX ;SET DATA SEG.
IF IBM
MOV AH,15
INT BIOS ;GET VIDEO MODE
MOV BYTE PTR VPAGE,BH ;STORE VIDEO PAGE #
MOV BYTE PTR SCRSIZE,AH ;STORE CHARS/LINE
MOV BYTE PTR VMODE,AL ;STORE DISPLAY MODE
ELSE
MOV BYTE PTR SCRSIZE,80 ;ASSUME 80 COLUMN DISPLAY (MODIFY IF NEEDED)
ENDIF
POP DS ;RESTORE INITIAL DATA SEG.
CALL CLRSCR ;CLEAR SCREEN, HOME CURSOR
MEMOK: MOV AX,DGROUP ;GET DATA SEG
MOV ES,AX ;SET EXTRA SEG TO POINT TO BUFFER
MOV BX,(80H) ;GET BYTE COUNT FOR COMMAND LINE
MOV AL,[BX] ;GET BYTE COUNT
CMP AL,0 ;TEST IT
JNE GOTFN ;IF GOT SOMETHING
JMP HELP ;NOTHING, GIVE HELP
GOTFN: MOV AH,0
INC BX
PUSH BX
ADD BX,AX
MOV [BX],BYTE PTR 0 ;MAKE SURE COMMAND LINE ENDS W. 0
POP BX
CALL SKIPSP ;SKIP BLANKS AND TABS
JNB START2 ;IF GOT SOMETHING
MOV AX,CS
MOV DS,AX
JMP HELP ;OTHERWISE GIVE HELP
START2: MOV DX,BX
MOV AL,READ_ACCESS
MOV AH,DOS2_OPEN
INT DOS ;TRY TO OPEN FILE
PUSHF ;SAVE STATUS
PUSH AX
MOV AX,DGROUP
MOV DS,AX ;SET DATA SEG
CALL CLRSCR ;CLEAR SCREEN
POP AX
POPF ;RESTORE STATUS FROM FILE OPEN
JNB OPENOK ;IF OK
JMP BADOPEN ;NOT OK, GIVE ERROR MSG.
OPENOK:
MOV WORD PTR INHANDLE,AX ;SAVE FILE HANDLE
CALL FILBUF ;FILL THE DISK BUFFER
BEGIN:
MOV BYTE PTR LINCNT,0 ;INIT LINE COUNT
MOV BYTE PTR COLCNT,1 ;AND COLUMN COUNT TO 1
MOV BYTE PTR LINMAX,24 ;SET MAX LINE COUNT
WRTFWD: MOV BX,OFFSET BUFFER ;POINT TO START OF BUFFER
WRTFWD1:MOV AL,BYTE PTR [BX] ;GET A CHARACTER
CMP AL,EOF ;IS IT EOF?
JNE L_2 ;IF NOT
JMP GETCMD ;EOF, GO WAIT FOR COMMAND ENTRY
L_2:
PUSH AX ;SAVE CHAR.
CALL CTYPE ;PUT IT ON CONSOLE
POP AX ;GET CHAR.
AND AL,7FH ;STRIP HI BIT
CMP AL,CR ;SEE IF END OF LINE
JE SAWCR ;IF GOT CR, CHECK FOR LF
CMP AL,LF ;CHECK FOR LF
JNE WRTFWD2 ;IF NOT LF
DEC BX ;POINT TO PREV. CHARACTER
CMP [BX],BYTE PTR CR ;WAS PREVIOUS CHARACTER CR?
PUSHF ;SAVE FLAGS
INC BX ;BUMP POINTER
POPF ;GET FLAGS - 'Z'=1 IF LAST CHAR. CR
JE WRTFWD2 ;IF CR, IGNORE IT
MOV AL,CR ;GOT LF ALONE, MAP TO CR
CALL CTYPE ;SHOW CR
JMP SHORT FWDCNT ;COUNT LF AS END OF LINE CHAR.
WRTFWD2:INC BX ;BUMP BUFFER POINTER
MOV DX,OFFSET BUFFER+FULBUF ;GET END OF BUFFER OFFSET
CMP BX,DX ;COMPARE W. BUFFER PTR.
JNE WRTFWD1 ;IF NOT EQUAL, CONTINUE
CALL FILBUF ;ELSE FILL BUFFER AGAIN
JMP WRTFWD ;..AND START AT BEGINNING OF BUFFER
SAWCR: MOV AL,BYTE PTR [BX+1] ;SAW CR, GET NEXT CHAR.
CMP AL,LF ;IS IT LF?
JE FWDCNT ;YES, DON'T WORRY
MOV AL,LF ;NO LF AFTER CR,
CALL CTYPE ;SHOW LF ANYWAY
FWDCNT: MOV SI,OFFSET LINCNT
MOV AL,BYTE PTR LINMAX ;GET MAX. LINE COUNT
CMP BYTE PTR [SI],AL ;COMPARE LINE COUNT WITH LIMIT
JNE WRTFWD2 ;IF NOT THERE, CONTINUE
MOV BYTE PTR [SI],0 ;RE-INIT LINE COUNT
GETCMD: ;WAIT FOR COMMAND
IF IBM
PUSH BX
MOV DH,24
MOV DL,0
CALL MOVEXY ;MOVE TO BOTTOM OF SCREEN
POP BX
ENDIF
CALL CIN ;GET CHAR. FROM CONSOLE
CALL UC ;MAKE IT UPPER CASE
CMP AL,0 ;IS IT NULL (FUNCTION KEY LEADIN)? -
JE FNKEY ;YES.
PUSH BX
MOV BX,OFFSET CMDLST ;POINT TO COMMAND LIST
CALL CMDSRC ;SEARCH FOR MATCH
POP BX
DEC AL ;-1 SO INDEX STARTS AT 0
JS BADCMD ;IF NO MATCH
SHL AL,1 ;DOUBLE INDEX
MOV AH,0 ;HI BYTE 0
MOV BX,AX ;INDEX IN INDEX REGISTER
JMP JMPTBL[BX] ;JUMP TO ROUTINE
FNKEY:
CALL CIN ;FUNCTION KEY PRESSED, GET NEXT CHAR.
CMP AL,49H ;PAGE UP?
JE GOBACK ;YES, GO BACK
CMP AL,51H ;PAGE DOWN?
JE GOFWD ;YES, GO FWD
BADCMD: CALL TYPTX ;..A WRONG CHOICE SO GIVE MESSAGE
DB CR,LF,LF
DB 'Commands: PG DN, PG UP, B(eginning), E(nd), X(exit)'
DB CR,BEL+80H
JMP GETCMD ;TRY AGAIN FOR COMMAND
GOFWD:
CMP BYTE PTR [BX],EOF ;AT EOF?
JE GETCMD ;YES, IGNORE 'FORWARD' COMMAND
MOV BYTE PTR LINMAX,24 ;24 LINES 2 WRITE
CALL CLRSCR ;CLEAR SCREEN
JMP WRTFWD1 ;SCROLL FORWARD
GOBACK:
MOV BYTE PTR LINMAX,24 ;24 LINES 2 WRITE
WRTBAK:
MOV BYTE PTR LINCNT,44 ;LINES TO MOVE BACK
CALL CLRSCR ;CLEAR THE SCREEN
WRTBAK1:
CMP BX,OFFSET BUFFER ;AT START OF BUFFER?
JE FILBAK ;IF AT START OF BUFFER
WRTBAK2:MOV AL,BYTE PTR [BX] ;GET A CHARACTER
DEC BX ;DECREMENT BUFFER
AND AL,7FH ;STRIP HI BIT
CMP AL,CR ;SEE IF END OF LINE
JE BAKCNT ;IF CR
CMP AL,LF
JNE WRTBAK1 ;IF NOT LF
MOV AL,BYTE PTR [BX] ;GET CHAR. BEFORE LF
CMP AL,CR ;IS CR?
JE WRTBAK1 ;YES, IGNORE LF
BAKCNT: DEC BYTE PTR LINCNT ;ELSE, DECR. NUMBER OF LINES TO MOVE BACK
JNZ WRTBAK1 ;..AND LOOP IF NOT THERE
INC BX ;ELSE BUMP POINTER TO ACCOUNT FOR LF WITH CR
JMP WRTFWD1 ;..AND GO WRITE A SCREEN
FILBAK: MOV DX,FULBUF ;GET THE BUFFER SIZE
MOV BX,WORD PTR AMTREAD ;AND THE # OF BYTES LAST READ
ADD BX,DX ;ADD THEM
MOV DX,WORD PTR FILEPOS
MOV CX,WORD PTR FILEPOS+2 ;LOAD FILEPOS INTO CX:DX
SUB DX,BX ;SUBTRACT AMT. TO MOVE BACK
JNB NOBORROW ;IF NO BORROW
SUB CX,1 ;CX <- CX-1 (AFFECTS BORROW FLAG)
NOBORROW:
JB FILBEG ;IF BEYOND BEGINNING OF FILE
MOV WORD PTR FILEPOS,DX ;STORE LO WORD OF FILE POS
MOV WORD PTR FILEPOS+2,CX ;AND HI WORD OF FILE POS
MOV BX,WORD PTR INHANDLE
MOV AL,0 ;POSITION FROM START
MOV AH,LSEEK
INT DOS ;MOVE FILE POINTER
CALL FILBUF ;FILL THE BUFFER
MOV BX,OFFSET BUFFER+FULBUF ;..AND POINT TO END OF BUFFER
CALL CLRSCR ;CLEAR THE SCREEN
JMP WRTBAK2 ;CONTINUE MOVING BACK IN FILE
ECMD: ;COME HERE TO MOVE TO END OF FILE
CALL CLRSCR ;CLEAR SCREEN
MOV AH,LSEEK ;PREPARE TO MOVE FILE POINTER
MOV BX,WORD PTR INHANDLE ;GET FILE HANDLE
MOV AL,2 ;POSITION AT END
MOV CX,0 ;OFFSET, MSW
MOV DX,0 ;OFFSET, LSW
INT DOS ;MOVE FILE POINTER
SUB AX,FULBUF ;SUBTRACT BUFFER SIZE
JNB NOBORR ;IF NO BORROW
SUB DX,1
JNB NOBORR ;IF FILE BIGGER THAN BUFFER
MOV AX,0
MOV DX,0 ;FILE SMALLER THAN BUFFER
JMP SHORT SMALL ;FILL BUFFER STARTING FROM BEGINNING
NOBORR:
MOV CX,DX ;MSW OF OFFSET IN CX
MOV DX,AX ;LSW OF OFFSET IN DX
SMALL:
MOV AH,LSEEK ;GOING TO MOVE POINTER AGAIN
MOV BX,WORD PTR INHANDLE ;GET HANDLE
MOV AL,0 ;POSITION FROM START
INT DOS ;MOVE FILE POINTER
MOV WORD PTR FILEPOS,AX ;UPDATE FILE POSITION
MOV WORD PTR FILEPOS+2,DX ;HI WORD TOO
CALL FILBUF ;FILL BUFFER
MOV BX,OFFSET BUFFER ;LOAD BUFFER OFFSET
ADD BX,WORD PTR AMTREAD ;COMPUTE ADDR. OF LAST VALID BYTE
MOV BYTE PTR LINMAX,24 ;24 LINES TO DISPLAY
MOV BYTE PTR LINCNT,24 ;24 LINES TO MOVE BACK
JMP WRTBAK1 ;GO BACK FROM END
BCMD: ;MOVE TO BEGINNING OF FILE
CALL CLRSCR ;CLEAR SCREEN
FILBEG: MOV WORD PTR FILEPOS,0 ;ZERO FILE POS
MOV WORD PTR FILEPOS+2,0
MOV CX,0
MOV DX,0
MOV BX,WORD PTR INHANDLE
MOV AL,0
MOV AH,LSEEK
INT DOS ;SEEK TO START OF FILE
CALL FILBUF ;FILL BUFFER
JMP BEGIN ;GO WRITE IT
FILBUF PROC NEAR ;FILL BUFFER FROM FILE
PUSH DX ;SAVE REGS.
PUSH BX
MOV BX,WORD PTR INHANDLE ;LOAD FILE HANDLE
MOV DX,OFFSET BUFFER ;LOAD OFFSET TO DISK BUFFER
MOV CX,FULBUF ;SIZE OF BUFFER
MOV AH,READ
INT DOS ;READ FROM DISK
JB RDERR ;IF ERROR
MOV WORD PTR AMTREAD,AX ;SAVE AMT. READ
CMP AX,CX ;IS BUFFER FULL?
JE FULL ;YES, IT IS
MOV BX,AX ;NO, MAKE BX POINT TO LAST BYTE+1
ADD BX,OFFSET BUFFER
MOV BYTE PTR [BX],EOF ;STICK IN EOF CHAR.
FULL:
ADD WORD PTR FILEPOS,AX ;UPDATE FILE POINTER
JNC NOCARRY
INC WORD PTR FILEPOS+2
NOCARRY: ;READ OK
POP BX
POP DX
RET
FILBUF ENDP
RDERR: CALL TYPTX ;READ ERROR
DB 'Disk read error.',CR,LF+80h
POP BX ;CLEAR STACK
POP DX
POP DX
JMP EXIT0 ;GO EXIT
BADOPEN: ;COME HERE WHEN CAN'T OPEN FILE
CALL TYPTX ;GIVE ERROR MSG AND QUIT
DB CR,LF,LF,'Requested file is not on this disk.',CR,LF
DB 'Please check your spelling or use DIR.',cr,lf,lf,bel+80H
JMP EXIT1 ;LEAVE MSG ON SCREEN ON EXIT
HELP: ;COME HERE WHEN NO FILE NAME GIVEN
MOV AX,DGROUP
MOV DS,AX
CALL CLRSCR
CALL TYPTX
DB 'SHOW V. 2.2 by Jon Dart (01-Nov-87)',CR,LF,CR,LF
DB 'Correct usage of SHOW is --',cr,lf,lf
DB ' A>SHOW filename ',cr,lf,lf
DB 'After first page is displayed, press the PG DN key to go'
DB CR,LF
DB "forward, and the PG UP key to go backward. 'B' moves to"
DB CR,LF
DB 'the beginning of the file, and E moves to the end. Type'
DB CR,LF
DB 'X to exit.',bel,cr,lf,lf+80h
JMP EXIT1
; OUTPUT 1 CHAR. - EXPANDS TABS, SHOWS CONTROL CHARS. IN VISIBLE FORM.
; ENTRY: AL = CHAR.
;
CTYPE PROC NEAR
PUSH CX ;SAVE THE REGISTERS
PUSH DX ;..FROM
PUSH BX ;..CLOBBER
AND AL,7FH ;STRIP HI BIT
JZ QUIT ;IF NULL
CMP AL,SPACE ;CONTROL CHAR?
JGE NOTCTL ;NOPE.
CMP AL,CR ;GOT CONTROL CHAR.
JE NOTCTL ;IF CR, JUST PRINT IT
CMP AL,LF
JE NOTCTL ;IF LF, JUST PRINT IT
CMP AL,TAB
JE GOTTAB ;IF TAB, EXPAND
ADD AL,'A'-1 ;ELSE CONVERT TO LETTER
PUSH AX
MOV AL,'^'
CALL CTYPE1 ;SHOW UP-ARROW
POP AX
NOTCTL: CALL CTYPE1 ;DISPLAY CHAR.
JMP SHORT QUIT
GOTTAB: MOV AL,COLCNT ;GET COLUMN COUNT
MOV BL,AL
CALL NEXTTAB ;COMPUTE NEXT TAB STOP
SUB AL,BL ;GET DISTANCE TO IT
MOV CL,AL
MOV CH,0
GOTAB: MOV AL,SPACE ;PRINT SPACES TO NEXT TAB STOP
PUSH CX
CALL CTYPE1
POP CX
LOOP GOTAB
QUIT: POP BX ;RESTORE
POP DX ;..THE REGISTERS
POP CX
RET
CTYPE ENDP
; SHOW 1 CHAR. (IN AL)
; DOESN'T SHOW PAST 80TH COLUMN
; ENTRY: AL = CHAR.
CTYPE1 PROC NEAR
IF IBM
CMP AL,SPACE
JGE NOTCTRL ;IF NOT CONTROL CHAR. (CR OR LF)
CTRL: CALL UPDATE ;CR OR LF, UPDATE LINE & COL. COUNTS
JMP SHORT MOVE ;JUST MOVE CURSOR
NOTCTRL:
MOV BL,BYTE PTR COLCNT
CMP BL,BYTE PTR SCRSIZE
JG UPDATE ;IF PAST LAST COL., DON'T SHOW CHAR.
PUSH AX
MOV AH,10 ;BIOS FUNCTION #
MOV BH,BYTE PTR VPAGE ;PAGE #
MOV CX,1 ;# CHARS. TO WRITE
INT BIOS ;WRITE USING BIOS
POP AX
CALL UPDATE ;UPDATE LINE AND COL. COUNTS
MOVE:
PUSH AX
MOV DH,BYTE PTR LINCNT ;LINE COUNT IN DH
MOV DL,BYTE PTR COLCNT ;COLUMN COUNT IN DL
DEC DL ;-1 CAUSE COLUMNS START AT 1
CALL MOVEXY ;MOVE CURSOR USING BIOS
POP AX
RET
ELSE
CMP BYTE PTR COLCNT,80 ;REACHED 80TH COL?
JG UPDATE ;YES, DON'T SHOW CHAR.
CALL COUT ;DISPLAY CHAR. USING DOS
ENDIF
UPDATE:
CMP AL,CR ;IF CHAR. = CR,
JE ZEROCOL ;ZERO COL. COUNT
CMP AL,LF ;DON'T COUNT LF
JE SKIPINC ;AS PRINTING CHAR.
INC BYTE PTR COLCNT ;PRINTING CHAR., BUMP COLUMN COUNT
RET
SKIPINC:
INC BYTE PTR LINCNT ;GOT LINE FEED, BUMP LINE COUNT
RET
ZEROCOL:
MOV BYTE PTR COLCNT,1
RET
CTYPE1 ENDP
; NEXTTAB = COMPUTE NEXT STANDARD TAB STOP
;
; ENTRY: (AL) = CURSOR POSITION
; EXIT: (AL) = POSITION OF NEXT TAB
; USES: AL,FLAGS
;
NEXTTAB PROC NEAR
PUSH CX
DEC AL
MOV CH,AL
AND AL,00000111B
MOV CL,8
SUB CL,AL
ADD CH,CL
MOV AL,CH
INC AL
POP CX
RET
NEXTTAB ENDP
XCMD:
EXIT0: CALL CLRSCR ;CLEAR THE SCREEN
EXIT1: CALL CLRCO ;CLEAR ANY TYPE-AHEAD
EXIT2: MOV AH,EXIT
INT DOS ;RETURN TO DOS
ENDCODE EQU $
END ENTRY